package org.szy.plugin.gen.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.noear.solon.data.annotation.Tran;
import org.szy.core.common.page.QueryPage;
import org.szy.core.common.service.BaseService;
import org.szy.plugin.gen.entity.GenBasic;
import org.szy.plugin.gen.param.GenBasicQueryParam;
import org.szy.plugin.gen.result.GenBasicTableColumnResult;
import org.szy.plugin.gen.result.GenBasicTableResult;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

/**
 * 生成基础 服务层。
 *
 * @author sunzhiyang
 * @since 2023-06-14
 */
public interface GenBasicService extends BaseService<GenBasic> {

    /**
     * 根据查询参数获取查询包装器
     *
     * @param param 查询参数
     * @return 查询包装器
     */
    QueryWrapper qwByQuery(GenBasicQueryParam param);

    /**
     * 分页查询
     *
     * @param page  分页参数
     * @param param 查询参数
     * @return 分页数据
     */
    Page<GenBasic> pageQuery(QueryPage<GenBasic> page, GenBasicQueryParam param);

    /**
     * 添加生成器基本表单字段
     *
     * @param entity 生成器基本表单字段实体
     * @return 是否成功
     */
    @Tran
    boolean add(GenBasic entity);

    /**
     * 获取数据库所有表信息
     *
     * @return 表信息列表
     */
    List<GenBasicTableResult> tables();

    /**
     * 获取该数据库表内所有字段信息
     *
     * @param dbTable 表名称
     * @return 字段列表
     */
    List<GenBasicTableColumnResult> tableColumns(String dbTable);

    /**
     * 创建配置
     *
     * @param id key
     * @return 创建是否成功
     */
    @Tran
    boolean createConfig(Serializable id);

    /**
     * 执行代码生成
     **/
    boolean execGenPro(Long id) throws IOException;

    /**
     * 执行代码生成（压缩包）
     */
    void execGenZip(Long id) throws IOException;

    /**
     * 测试生成
     *
     * @param tableName   表名称
     * @param tableRemark 表备注
     * @param author      作者
     * @param packageName 报名，可以为空
     * @return 是否成功
     */
    void textGen(String tableName, String tableRemark, String author, String packageName) throws IOException;
}
